/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package DAO;

import DAO.util.ConectaBanco;
import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Calendar;


import model.Mensalidade;

/**
 *
 * @author Alex
 */
public class MensalidadeDAO {

    public boolean criar(Mensalidade mensalidade) {
        try {
            Connection conexao = ConectaBanco.getConexao();

            String sql = "insert into mensalidade(matricula, vencimento, data_pagamento,valor,status) values (?,?,null,30, 1)";
            // seta os parametros no sql
            PreparedStatement pstmt = conexao.prepareCall(sql);

            pstmt.setInt(1, mensalidade.getMatricula().getMatricula());
            pstmt.setDate(2, new Date(mensalidade.getVencimento().getTime()));

            System.out.println(sql);
            pstmt.execute();

            conexao.close();
            return true;

        } catch (SQLException sql) {

            return false;

        }
    }

    public boolean criarNovaMensalidade(Mensalidade mensalidade) {
        try {
            Connection conexao = ConectaBanco.getConexao();

            String sql = "insert into mensalidade(matricula, vencimento, data_pagamento,valor, status) values (?,?,null,30,1)";
            // seta os parametros no sql
            PreparedStatement pstmt = conexao.prepareCall(sql);

            pstmt.setInt(1, mensalidade.getMatricula().getMatricula());
            System.out.println("número da matricula no criar nova mensalidade" + mensalidade.getMatricula().getMatricula());
            Date d = new Date(mensalidade.getVencimento().getTime());
            Calendar c = Calendar.getInstance();
            c.setTime(d);
            c.set(Calendar.MONTH, c.get(Calendar.MONTH) + 1);
            pstmt.setDate(2,new java.sql.Date(c.getTimeInMillis()));

            System.out.println(sql);
            pstmt.execute();

            conexao.close();
            return true;

        } catch (SQLException sql) {

            return false;

        }
    }

    public ArrayList<Mensalidade> buscarMensalidades(int matricula) throws ClassNotFoundException {
        ArrayList<Mensalidade> mensalidades = new ArrayList<Mensalidade>();
        Connection conexao = null;
        try {
            conexao = ConectaBanco.getConexao();
            System.out.println("número da matricula " + matricula);
            String sql = "select * from mensalidade where matricula =? and status=1 ";

            PreparedStatement pst = conexao.prepareStatement(sql);

            pst.setInt(1, matricula);

            ResultSet rs = pst.executeQuery();

            MatriculaDAO matriculaDAO = new MatriculaDAO();

            while (rs.next()) {
                Mensalidade mensalidade = new Mensalidade();
                mensalidade.setId(rs.getInt("id"));
                mensalidade.setMatricula(matriculaDAO.buscarByMatricula(rs.getInt("matricula")));
                mensalidade.setVencimento(rs.getDate("vencimento"));
                mensalidade.setStatus(rs.getInt("status"));
                // mensalidade.setData_pagamento(rs.getDate("data_pagamento"));
                mensalidades.add(mensalidade);
            }
            conexao.close();
            return mensalidades;

        } catch (SQLException sql) {
            return null;
        }

    }

    public ArrayList<Mensalidade> buscarAvisoMensalidade() throws ClassNotFoundException {
        ArrayList<Mensalidade> mensalidades = new ArrayList<Mensalidade>();
        Connection conexao = null;
        try {
            conexao = ConectaBanco.getConexao();
            String sql = "select * from mensalidade where status = 1 or status =2 and vencimento between current_date and current_date +3 ";

            PreparedStatement pst = conexao.prepareStatement(sql);

            ResultSet rs = pst.executeQuery();
            conexao.close();

            MatriculaDAO matriculaDAO = new MatriculaDAO();
            java.util.Date hoje = new java.util.Date();
            java.sql.Date dataAtual = new java.sql.Date(hoje.getTime());

            while (rs.next()) {
                Mensalidade mensalidade = new Mensalidade();
                mensalidade.setId(rs.getInt("id"));
                mensalidade.setMatricula(matriculaDAO.buscarByMatricula(rs.getInt("matricula")));
                mensalidade.setVencimento(rs.getDate("vencimento"));
                mensalidade.setStatus(rs.getInt("status"));
                mensalidade.setData_pagamento(rs.getDate("data_pagamento"));
                mensalidades.add(mensalidade);
            }

            return mensalidades;

        } catch (SQLException sql) {
            return null;
        }

    }

    public Mensalidade buscarByCodigo(int codigo) throws ClassNotFoundException, SQLException {
        Connection conexao = ConectaBanco.getConexao();
        PreparedStatement sql = conexao.prepareStatement("select * from mensalidade where id=? and status=1");
        sql.setInt(1, codigo);
        ResultSet rs = sql.executeQuery();

        Mensalidade mensalidade = new Mensalidade();
        MatriculaDAO matriculaDAO = new MatriculaDAO();
        while (rs.next()) {

            mensalidade.setId(rs.getInt("id"));
            mensalidade.setMatricula(matriculaDAO.buscarByMatricula(rs.getInt("matricula")));
            mensalidade.setVencimento(rs.getDate("vencimento"));
            mensalidade.setStatus(rs.getInt("status"));
            mensalidade.setData_pagamento(rs.getDate("data_pagamento"));

        }
        conexao.close();
        return mensalidade;
    }

    public Mensalidade buscarByMatricula(int codigo) throws ClassNotFoundException, SQLException {
        Connection conexao = ConectaBanco.getConexao();
        PreparedStatement sql = conexao.prepareStatement("select * from mensalidade where matricula=? and status=1");
        sql.setInt(1, codigo);
        ResultSet rs = sql.executeQuery();

        Mensalidade mensalidade = new Mensalidade();
        MatriculaDAO matriculaDAO = new MatriculaDAO();
        while (rs.next()) {

            mensalidade.setId(rs.getInt("id"));
            mensalidade.setMatricula(matriculaDAO.buscarByMatricula(rs.getInt("matricula")));
            mensalidade.setVencimento(rs.getDate("vencimento"));
            mensalidade.setStatus(rs.getInt("status"));
            mensalidade.setData_pagamento(rs.getDate("data_pagamento"));

        }
        conexao.close();
        return mensalidade;
    }

    public boolean atualizar(Mensalidade mensalidade) {
        try {
            Connection conexao = ConectaBanco.getConexao();

            String sql = "update mensalidade set matricula=?, vencimento=?, status=? data_pagamento=? where id=?";

            PreparedStatement pstmt = conexao.prepareCall(sql);
            pstmt.setInt(1, mensalidade.getMatricula().getMatricula());
            pstmt.setDate(2, new Date(mensalidade.getVencimento().getTime()));
            pstmt.setInt(3, mensalidade.getStatus());
            pstmt.setDate(4, mensalidade.getData_pagamento());
            pstmt.setInt(5, mensalidade.getId());

            System.out.println(sql);
            pstmt.execute();
            System.out.println("Mensalidade atualizada com sucesso");
            conexao.close();
            return true;
        } catch (SQLException sql) {
            System.out.println("Erro ao atualizar registro");

            return false;

        }
    }

    /*  public boolean marcarAtrasado(int id) {
     try {
     Connection conexao = ConectaBanco.getConexao();

     String sql = "update produto set status=2 where id=?";

     PreparedStatement pstmt = conexao.prepareCall(sql);

     pstmt.setInt(1, id);


     pstmt.execute();

     conexao.close();
     return true;
     } catch (SQLException sql) {
        
     return false;

     }
     }*/
    public boolean pagamentoEfetuado(int id) {
        try {
            Connection conexao = ConectaBanco.getConexao();

            String sql = "update mensalidade set data_pagamento=current_timestamp, status=0 where id=?";

            PreparedStatement pstmt = conexao.prepareCall(sql);

            pstmt.setInt(1, id);

            pstmt.execute();

            conexao.close();
            return true;
        } catch (SQLException sql) {

            return false;

        }
    }

        public ArrayList<Mensalidade> buscarPorData(Date data_inicial, Date data_final) throws ClassNotFoundException {
        ArrayList<Mensalidade> mensalidades = new ArrayList<Mensalidade>();
        Connection conexao = null;
        try {
            conexao = ConectaBanco.getConexao();
            String sql = "select * from mensalidade where  data_pagamento between ? and ? and status=0";


            PreparedStatement pst = conexao.prepareStatement(sql);
           
            
            pst.setDate(1, data_inicial);
            pst.setDate(2, data_final);
            ResultSet rs = pst.executeQuery();
                                    
            MatriculaDAO matriculaDAO = new MatriculaDAO();
              



            while (rs.next()) {
                Mensalidade mensalidade = new Mensalidade();
                
                
                
               mensalidade.setId(rs.getInt("id"));
               mensalidade.setData_pagamento(rs.getDate("data_pagamento"));
               
               System.out.println("teste número da matricula enviado  "+rs.getInt("matricula"));
               mensalidade.setMatricula(matriculaDAO.buscarByMatricula(rs.getInt("matricula")));
               
                
               mensalidade.setValor(rs.getDouble("valor"));
               
                
                
                
                mensalidades.add(mensalidade);
            }
            conexao.close();
            return mensalidades;

        } catch (Exception sql) {
            System.out.println("Erro ao buscar por data"+ sql.getMessage());
            return null;
        }

    }

    
    
    
    
    
}
